from sqlalchemy.testing.pickleable import User
from info.lib.yuntongxun import *
from info import redis_store
from info.utitls.captcha.captcha import captcha
from info.module.passport import  passport_bp
from flask import request, abort, current_app, jsonify,make_response
from info.utitls import response_code
# 2.使用蓝图
# 127.0.0.1:5000/passport/image_code?code_id=UUID
@passport_bp.route('/image_code')
def get_image_code():
    '''获取图片验证码'''
    '''
    1.获取参数
        1.1获取code_id:唯一编码UUID
    2.校验参数
        2.1判断code id是否有值
    3.逻辑处理
        3.1生成图片验证码 & 生成验证码图片上的真实值
        3.2根据code id编号作为key将生成验证码图片的真实值存到redis数据，并且设置有效时长（后续接口需要校验）
    4，返回值
        4.1生成验证码图片，返回给前端
    '''

    # 1.1获取code_id:唯一编码UUID

    code_id = request.args.get('code_id')

    #2.1判断code id是否有值
    if not code_id:
        current_app.longger.error('参数不足')
        abort(403)

    # 3.1生成图片验证码 & 生成验证码图片上的真实值
    image_name, image_code, image_data = captcha.generate_captcha()
    # 3.2根据code id编号作为key将生成验证码图片的真实值
    redis_store.setex('ImageCode_%s'% code_id, cons)


@passport_bp.route('/sms_code', methods=['PSOT'])
def send_smscode():
    '''发送短信验证码后端接口'''
    '''
    1.获取参数
        1.1 mobile：手机号码 image_code_id:uuid唯一编号 image_code:永华填写图片验证码真实值
    2.检验参数
        2.1非空判断
        2.2正则检验手机号码格式
    3.逻辑处理
        3.1根据image_code_id编号去redis数据库获取正确的图片验证码真实值
            3.1.1 real_image_code有值：从数据库删除（防止多次使用这个值进行校验）
            3.1.2 real_image_code没有值：图片验证码过期了
        3.2 然后进行比对校验：
            3.2.1 相等：发送短信验证码
            3.2.2 不想等：告诉前段图片验证码填写错误，前段再次生成一张图片
        TODO：查询手机号码是否被注册过
        3.3 发送短信验证码细节
            3.3.1 生成6位随机短信值：
            3.3.2 调用封装好的ccp短信验证码工具类发送
            3.3.3 发送短信验证码成功后，保存6位随机值到redis数据库
    4.返回值
        4.1 发送短信验证码成功
    '''

    # 1.1 mobile：手机号码 image_code_id:uuid唯一编号 image_code:永华填写图片验证码真实值
    # json.loads(request.data)
    # 提取前段发送的json格式数据，并且将数据转换成python对象
    param_dict = request.json
    mobile = param_dict.get('mobile')
    image_code = param_dict.get('image_code')
    image_code_id = param_dict.get('image_code_id')
    # 2.1 非空判断
    if not all([mobile, image_code, image_code_id]):
        current_app.logger.error('参数错误')
        return jsonify(error=RET.PARAMERR,errmsg='参数错误')
    import re
    if not re.match('1[35789][0-9]{9}', mobile):
        current_app.logger.error('手机格式错误')
        return jsonify(error=RET.PARAMERR, errmsg='手机格式错误')
    # 3.1根据image_code_id编号去redis数据库获取正确的图片验证码真实值
    try:
        real_image_code = redis_store.get('ImageCOde_%s'%image_code_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DEBRR,errmasg='')
    else:
    #         3.1.1 real_image_code有值：从数据库删除（防止多次使用这个值进行校验）
    #         3.1.2 real_image_code没有值：图片验证码过期了
    #     3.2 然后进行比对校验：
    # 细节1：忽略大小写
    # 细节2：real_image_code如果直接拿去是二进制格式
    if image_code.lower() == real_image_code.lower():

    # 3.2.2 不想等：告诉前段图片验证码填写错误，前段再次生成一张图片
        current_app.logger.error('图片验证码错误')
        return jsonify(errno=RET.DATAERR, errmsg='填写图片验证码错误')
    try:
        user = User.query.filter(User.mobile == mobile).first()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='查询用户数据异常')
    if user:
        # 用户已经注册
        return jsonify(errno=RET.DATAEXIST, errmsg='用户已经注册')

    import random

    #         3.2.1 相等：发送短信验证码
    #     TODO：查询手机号码是否被注册过
    #     3.3 发送短信验证码细节
    sms_code = random.randint(0,999999)
    sms_code = '%06d'%sms_code
    #         3.3.1 生成6位随机短信值：
    #         3.3.2 调用封装好的ccp短信验证码工具类发送
    '''
    参数1：手机号码
    参数2：{6位验证码，分钟}
    参数3：模板id 1：您的验证码

    '''
    try:
        result = 
    #         3.3.3 发送短信验证码成功后，保存6位随机值到